package com.itheima.producer;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 发送消息
 */
public class Producer_Routing {
    public static void main(String[] args) throws IOException, TimeoutException {
        
        //1.创建connection工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数,ip,端口,virtual,username,password
        factory.setVirtualHost("/itcast");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setHost("192.168.23.129");
        //2.创建connection
        Connection connection = factory.newConnection();
        //3.创建channel
        Channel channel = connection.createChannel();
        //4.创建交换机,类型为route对应Direct
        String exchangeName = "routing_exchange";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,
                true, false, false, null);
        /*
        (String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete,
			boolean internal, Map<String, Object> arguments) 
         */
        //5.创建队列
        String queue1 = "routing_queue1";
        String queue2 = "routing_queue2";
        channel.queueDeclare(queue1, true, false, false, null);
        channel.queueDeclare(queue2, true, false, false, null);
        /*
        (String queue,
			boolean durable, boolean exclusive, boolean autoDelete,
			Map<String, Object> arguments)
         */
        //6.创建队列绑定交换机,通过routingkey
        channel.queueBind(queue1, exchangeName, "error", null);
        channel.queueBind(queue2, exchangeName, "info", null);
        channel.queueBind(queue2, exchangeName, "error", null);
        channel.queueBind(queue2, exchangeName, "warning", null);
        /*
        (String queue,
			String exchange, String routingKey, Map<String, Object> arguments)
         */
        //7.发送消息
        for (int i = 0; i < 5; i++) {
            
            channel.basicPublish(exchangeName, "error", null, "这个error消息".getBytes());
        }
        for (int i = 0; i < 5; i++) {
            
            channel.basicPublish(exchangeName, "info", null, "这个info消息".getBytes());
        }
        /*
        (String exchange, String routingKey,
			boolean mandatory, boolean immediate, BasicProperties props,
			byte[] body) 
         */
        //8.关闭资源
        channel.close();
        connection.close();
        //
        //
        //
        //
        //
        //
        //
        //
        //
        //
        //
        
        //  //1.创建连接工厂
        //  ConnectionFactory factory = new ConnectionFactory();
        //  //2. 设置参数
        //  factory.setHost("172.16.98.133");//ip  默认值 localhost
        //  factory.setPort(5672); //端口  默认值 5672
        //  factory.setVirtualHost("/itcast");//虚拟机 默认值/
        //  factory.setUsername("heima");//用户名 默认 guest
        //  factory.setPassword("heima");//密码 默认值 guest
        //  //3. 创建连接 Connection
        //  Connection connection = factory.newConnection();
        //  //4. 创建Channel
        //  Channel channel = connection.createChannel();
        // /*
        //
        // exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
        // 参数：
        //  1. exchange:交换机名称
        //  2. type:交换机类型
        //      DIRECT("direct"),：定向
        //      FANOUT("fanout"),：扇形（广播），发送消息到每一个与之绑定队列。
        //      TOPIC("topic"),通配符的方式
        //      HEADERS("headers");参数匹配
        //
        //  3. durable:是否持久化
        //  4. autoDelete:自动删除
        //  5. internal：内部使用。 一般false
        //  6. arguments：参数
        //  */
        //
        // String exchangeName = "test_direct";
        //  //5. 创建交换机
        //  channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,false,null);
        //  //6. 创建队列
        //  String queue1Name = "test_direct_queue1";
        //  String queue2Name = "test_direct_queue2";
        //
        //  channel.queueDeclare(queue1Name,true,false,false,null);
        //  channel.queueDeclare(queue2Name,true,false,false,null);
        //  //7. 绑定队列和交换机
        //  /*
        //  queueBind(String queue, String exchange, String routingKey)
        //  参数：
        //      1. queue：队列名称
        //      2. exchange：交换机名称
        //      3. routingKey：路由键，绑定规则
        //          如果交换机的类型为fanout ，routingKey设置为""
        //   */
        //  //队列1绑定 error
        //  channel.queueBind(queue1Name,exchangeName,"error");
        //  //队列2绑定 info  error  warning
        //  channel.queueBind(queue2Name,exchangeName,"info");
        //  channel.queueBind(queue2Name,exchangeName,"error");
        //  channel.queueBind(queue2Name,exchangeName,"warning");
        //
        //  String body = "日志信息：张三调用了delete方法...出错误了。。。日志级别：error...";
        //  //8. 发送消息
        //  channel.basicPublish(exchangeName,"warning",null,body.getBytes());
        //
        //  //9. 释放资源
        //  channel.close();
        //  connection.close();
        
    }
}
